/*
 * @ Created with Clion
 * @ Author Morbid
 * @ Date 2022/07/12
 * @ Time 10:23
 */

/*!
 * 定义双链表
 * 实现双链表基本操作（带头）
 */

#include <cstdlib>
typedef int ElemType;
typedef struct DNode {
    ElemType data;
    struct DNode *prior, *next;
} DNode, *DLinkList;

/*!
 * 初始化双链表
 * @param L 双链表
 * @return 初始化成功返回true，否则返回false
 */
bool InitDLinkList(DLinkList &L) {
    L = (DNode *) malloc(sizeof(DNode));
    if (L == NULL)
        return false;
    L->prior = nullptr;
    L->next = nullptr;
    return true;
}

/*!
 * 在指定节点的后面插入节点
 * @param p 指定节点
 * @param s 要插入的节点
 * @return 插入成功返回true，否则返回false
 */
bool InsertNextDNode(DNode *p, DNode *s) {
    if (p == nullptr || s == nullptr)
        return false;
    s->next = p->next;
    if (p->next != nullptr)
        p->next->prior = s;
    s->prior = p;
    p->next = s;
    return true;
}

/*!
 * 删除指定节点的后继节点
 * @param p 指定节点
 * @return 删除成功返回true，否则返回false
 */
bool DeleteNextDNode(DNode *p) {
    if (p->next == nullptr)
        return false;
    DNode *q = p->next;
    p->next = q->next;
    if (q->next != nullptr)
        q->next->prior = p;
    free(q);
    return true;
}

/*!
 * 消毁双链表
 * @param L 双链表
 */
void DestoryList(DLinkList &L) {
    while (L->next != nullptr)
        DeleteNextDNode(L);
    free(L);
    L = nullptr;
}